package com.atguigu.interview.study.javase;

import java.util.HashMap;
import java.util.Map;

/**
 * @author gcq
 * @Create 2020-12-07
 * <p>给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。
 * 示例:
 *</p>
 * 给定 nums = [2, 7, 11, 15], target = 9
 * <p>
 * 因为 nums[0] + nums[1] = 2 + 7 = 9 //  7 = 9 - 2 //  9 = 7 + 2
 * 所以返回 [0, 1]
 *</p>
 */
public class ToSumDemo {
    public static void main(String[] args) {
        int[] nums = new int[]{2, 7, 11, 15};
        int[] ints = twoSum2(nums, 9);
        for (int anInt : ints) {
            System.out.print(anInt);
        }
    }

    /**
     * 通过双重循环遍历数组中所有的元素的两两组合
     * 当出现符合时返回两个元素的下标
     * @param nums
     * @param target
     * @return
     */
    public static int[] twoSum1(int[] nums, int target) {
        for(int i = 0; i <= nums.length; i++) {
            for(int j = i+1; j <= nums.length; i++) {
                // 9 = 7 + 2
                if (target == nums[i] + nums[j]) {
                    return new int[]{i,j};
                }
                // 9 - 7 = 2
//                if (target - nums[i] == nums[j]) {
//                    return new int[]{i,j};
//                }
            }
        }
        return null;
    }

    /**
     *
     * @param nums
     * @param target
     * @return
     */
    public static int[] twoSum2(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i <= nums.length; i++) {
            // 2 = 9 - 7
            int partnerNumber = target - nums[i];
            if (map.containsKey(partnerNumber)) {
                return new int[]{map.get(partnerNumber),i};
            }
            map.put(nums[i],i);
            // k值 v下标
            // 2   0
        }
        return null;
    }


}